//
//  ChangeEnvironmentManager.h
//  MobileCaiLocal
//
//  Created by simon on 2021/3/30.
//  Copyright © 2021 com.Chs. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "ZXChangeEnvironmentModel.h"


NS_ASSUME_NONNULL_BEGIN

typedef NS_ENUM(NSInteger, ApiEnv)
{
    ///未知
    ApiEnvUnknown = 0,
    
    // 线上环境（生产环境）-用途：实际对外提供服务的环境。预发环境验证成功后，可以正式发布到线上环境。
    // 特点：稳定性要求高，数据真实，配置最优。
    ApiEnvProd = 1,
    
    // 预发环境-用途：模拟生产环境，用于最终验证。
    // 特点：测试通过后，可以发布到预发环境，这时应用访问的是线上真实数据，但应用只在内部访问。
    ApiEnvPre = 2,
    
    // 测试环境-用途：用于功能测试、集成测试、性能测试（压力测试）和安全测试。
    // 特点：开发调试完成后，发布到测试环境，应用在测试服务器上运行，访问的是测试数据。
    ApiEnvTest = 3,
    
    // 日常环境-用途：团队协作开发、初步功能验证。
    // 特点：团队共享的环境，用于集成开发和初步测试。
    // 环境配置：环境配置接近测试环境，但可能不完全一致。
    // 数据：模拟数据或脱敏数据。
    // 使用者：整个开发团队
    ApiEnvDaily = 4,
    
    // 开发环境：用途：个人开发、单元测试。
    // 环境配置：灵活，开发者可自定义。
    // 数据：模拟数据。
    // 使用者：单个开发者。
    // 隔离性：独立环境，隔离性好。
    ApiEnvDev = 5,
    
    // 本地环境-用途：开发者在自己的机器上开发和调试代码。
    ApiEnvLocal = 6,
};


///构建配置，有Debug、Profile、Release三种构建方式。Profile构建方式是为了兼容flutter创建的工程。
typedef NS_ENUM(NSInteger, BuildConfiguration)
{
    ///Debug，用于模拟器测试
    BuildConfigurationDebug = 0,
    ///Profile，Release编译，用于真机内测，支持Flutter工程
    BuildConfigurationProfile = 1,
    ///Release-发布固定
    BuildConfigurationRelease = 2,
};


///环境切换通知
FOUNDATION_EXPORT NSNotificationName const kEnvironmentChangeNotification;

@interface ChangeEnvironmentManager : NSObject

@property (nonatomic, readonly) NSString *prodHost;
@property (nonatomic, readonly) NSString *preHost;
@property (nonatomic, readonly) NSString *testHost;
@property (nonatomic, readonly) NSString *dailyHost;
@property (nonatomic, readonly) NSString *devHost;
@property (nonatomic, readonly) NSString *localHost;

//设置自定义构建模式,默认构建模式
@property (nonatomic, assign) BuildConfiguration buildConfiguration;



+ (instancetype)sharedInstance;


/// 初始化环境状态;默认环境
+ (ChangeEnvironmentManager *)startWithDebugDefaultApiEnv:(ApiEnv)debugDefaultApiEnv
                                     profileDefaultApiEnv:(ApiEnv)profileDefaultApiEnv;

/// 初始化自定义环境状态;默认支持Debug/Release
/// @param prod 线上
/// @param pre 预发
/// @param test 测试
/// @param daily 日常
/// @param dev 开发
/// @param local 本地
+ (ChangeEnvironmentManager *)startWithProdHost:(nullable NSString *)prod
                                        preHost:(nullable NSString *)pre
                                       testHost:(nullable NSString *)test
                                      dailyHost:(nullable NSString *)daily
                                        devHost:(nullable NSString *)dev
                                      localHost:(nullable NSString *)local
                             debugDefaultApiEnv:(ApiEnv)debugDefaultApiEnv
                           profileDefaultApiEnv:(ApiEnv)profileDefaultApiEnv;

//// 设置构建模式-必须设置默认构建模式或者自定义构建模式
- (void)setDefaultBuildConfiguration;
////
///// 设置自定义构建模式
///// @param fonfiguration fonfiguration description
//- (void)setCustomBuildConfiguration:(BuildConfiguration)fonfiguration;


/// 切换环境事件，会发送kEnvironmentChangeNotification通知
/// @param apiEnv apiEnv description
+ (void)changeEnvironmentActionWithApiEnv:(ApiEnv)apiEnv;

/// 获取环境
+ (ApiEnv)apiEnv;
+ (ApiEnv)switchEnvStringToApiEnv:(NSString *)envType;

/// 获取http请求的域名,给网络请求用
+ (NSString *)apiEnvHTTPBaseURL;


+ (NSArray<ZXChangeEnvironmentModel *> *)allApiEnvConfigu;
@end

NS_ASSUME_NONNULL_END
